14章 ストレートなコードの構成
moch5oMaki.icon
コードの構成についての章。実行順が重要な場合とそうではない場合で、それぞれ望ましいコードの構成(書く順序)について述べられている。
「ストレート」という表現はニュアンス的には整頓された、とか理路整然とした、とかいうあたりかな。
あっちこっちにゴチャゴチャしてない、っていうイメージにも「ストレート」という言葉は合うし、この言い回しもなるほどなー、となったmoch5oMaki.icon
3 叙述的用法の形容詞
a整頓(せいとん)して,きちんとして.
b間違いがなくて,正して.
set put the record straight 記録を正す. 4 a(目的に向かって)ひたむきな; 理路整然とした,筋の通った.
straight thinking 筋の通った考え方.
14.1 順序が重要なステートメント
実行されるプログラム同士に依存関係がある場合は、順序が重要であることが明白なコードにしよう、という話
そのための方法としていくつか列挙されている
実行順が重要なコードの代表例は、上から下へ処理の順番通りに書かれているコード
引数を受け渡しながら処理が書かれていて、見てすぐに書かれた順番通りに実行されることが期待されているコードと分かる
よくないパターンとして紹介されているのは、処理同士に依存性があるのにそれが隠されているステートメント
引数がそもそもない
ルーチンの命名が処理内容を正確に表してない(実際はinitializeしているのに名前が違う)
順序が重要なステートメントでは、以下のガイドラインを守ると良いとのこと
依存性が明白になるようなコード構成にする
ComputeMarketExpenceルーチンで変数を初期化せずに、InitializeExpenceDataなど別のルーチンを用意する
依存性が明白になるようなルーチン名にする
構成のところとちょっと重なるけど、InitializeExpenceDataのルーチンを作っても名前がまずいとダメだよという話
変数を初期化しているルーチンなら、そういう名前にすることが大事
ルーチン名が長すぎるようだったら、ルーチンの処理内容がまずいということ
ルーチンの引数を使って依存性を明白にする
引数をうまく使って実行順があることが分かるようにする
(コードの書き方でなんとかならない場合のみ)コメントに書いて実行順を明白にする
本書で度々登場する「力技でとにかくテキストやドキュメントにしてしまう」方式
なんらかの理由でコード自体を改良できない場合に、書かないより書いた方が保守しやすい
アサーションやエラー処理コードを使って依存性を検査する
クラスのコンストラクタでinitializeされたかどうかのフラグをまずfalseにしておく
→InitializeDataのルーチンでフラグをtrueにしつつ変数を初期化
→初期化の後に処理されるべき各ルーチン内でアサーションやエラー処理を使ってフラグの状態を確認
ここまでやるのかな、とも思ったけど…moch5oMaki.icon
本書にも、この方法によるメリットと、コードの複雑さが増すことや新しいエラーが発生するかもしれないというデメリットとを秤にかける必要があるだろう、と書かれている
勧められた本(まだ読めてない):ソフトウェアの複合/構造化設計
14.2 順序が重要でないステートメント
順序が重要でないステートメントの場合でも注意することがある、という話。
ステートメント間に依存性がない場合、自由にコードを書いてもプログラムは正しく動くが、コードの可読性、パフォーマンス、保守に影響する。
実行順序が特に決まっていない場合は、基本的には 関連する作業を一つにまとめるという近接の法則 を使う。 上から下へ読めるコードにする
参照するオブジェクトごとに近くに集めて書いている
変数の寿命という概念を具体化するには、変数が最初に参照される行と最後に参照される行の間にある行数を数えればよい(10.4.3 変数の寿命 より引用)
関連するステートメントをグループ化する
関連するステートメントとは、複数のステートメント間で下記に当てはまるような場合
同じデータを処理している場合
同様のタスクを実行している場合
それぞれが順番に実行されることを前提にしている場合
PPP(疑似コードプログラミングプロセス)を実践していれば、これらは自然とグループ化されているはず、とのこと
確かに、コードではなくて自然言語で処理を書いていくと上から下へと書くので自然と同じ処理は固めて書くことになるmoch5oMaki.icon
また、コードを印刷して関連する処理を四角で囲むときれいに分割され、交差しない
さらに、このようにして関連するステートメントが集まったら前後にあるステートメントとの関連をさらにチェックする
前後のステートメントとの関連が重要でない場合は、関連するステートメントの箇所をリファクタリングでルーチンとして独立させるとよい
チェックリストはここまでに列挙してきたので割愛
ストレートなコードの構成にするためのまとめ
最も重視されるのは、実行順序への依存性
依存性は、良いルーチン名、引数リスト、コメントなどを使って明白にする
コードが極めて重要なものである場合は、状態変数を使用する
コードが実行順に依存しない場合は、関連するステートメントをできるだけ近くにまとめる